package zuo.baseUP6_bitCalculator;

/**
 * @Author: Forx
 * @Data: 2021/6/19
 * @Desc: Algorithm - zuo.baseUP6_bitCalculator
 * @Version: v1.0
 */
public class bitCal {
    /**
     * 位运算的题目
     * 之前介绍过一些,下面继续
     * 给定两个有符号32位整数a和b,返回a和b中较大的。
     * 相减看符号位-可能溢出
     * 要求】
     * 不用做任何比较判断。
     * */
    /**
     * 问题不重要,重要的是解决问题的方法
     *
     * 我们可以通过数学表达式来表达if-else
     * 如"diff*sa + same*sc;"这句中的*起到了
     * &的作用 +起到了|的作用
     *
     * */
    public static int getMax(int a ,int b){
        int c = a-b;
        int sa = (a>>>31)^1;//得到a的符号位,如果a为正数则符号位为1
        int sb = (b>>>31)^1;
        int sc = (c>>>31)^1;
        int diff = sa^sb;//判断a与b是否符号位相同,若不同为1
        int same = diff^1;//判断a与b是否符号位相同,若相同为1
        int retuenA = diff*sa + same*sc;//返回a的条件
        int returnB = retuenA^1;
        return a*retuenA + b*returnB;

    }

    /**
     *判断一个32位正数是不是2的幂、4的幂
     *
     * 如果一个数只有一个位为1那就是2的幂
     * 如果一个数只有偶数位(从0开始,0算偶数)为1那就是4的幂
     *
     * */
    public static boolean is2Mi(int num){
        return (num & (~num + 1)) == num;//num & (~num + 1)获得最右侧的1
    }
    public static boolean is2Mi2(int num){
        return (num&(num-1))==0;//假如num只有一个1那么减一会将那个1打散,然后再与就会是0
    }
    public static boolean is4Mi(int num){
        if(is2Mi2(num)){
            return (num&0x55555555)!=0;//01010101010101010101010101010101=0x55555555
        }
        return false;
    }
    /**
     * 给定两个有符号32位整数a和b,不能使用算术运算符,分别实现a和b的加、減、乘、除运
     * 算
     * [要求]
     * 如果给定a、b执行加减乘除的运算结果就会导致数据的溢出,那么你实现的函数不必对此
     * 负责,除此之外请保证计算过程不发生溢出
     *
     * a+b = a^b + (a&b)<<1 其中^相当于无进位相加 &<<1相当于进位信息 ,然后对^结果和&<<1的结果继续这样计算
     * 直到进位信息为0,此时的无进位相加就是结果
     *
     *
     *
     * */
    public static int add(int a,int b){
        int sum = a;
        while (b!=0){
            sum = a^b;
            b = (a&b)<<1;
            a = sum;
        }
        return sum;

    }
    /**
     * 乘法就是计算机组成原理上的补码一位乘法——Booth算法
     * */
    public static int muti(int a,int b){
        int res = 0;
        while (b!=0){
            if((b&1)!=0){
                res  = add(res,a);
            }
            a<<=1;
            b >>>=1;
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE+1);
    }
}
